package DataControl;
import java.nio.file.Paths;

import Data.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * 服务器数据解析器
 * 解析服务器的数据，对serverData进行解析
 */
public class ServerDataResolver implements IServerDataResolver {
    public DataPort serverData;//带有整个文件夹数据或单个文件部分数据
    private String Path;//当前服务器路径
    /**
     * 构造函数：初始化服务器数据解析器
     */
    public ServerDataResolver(){}
    public void setServerData(DataPort serverData){
        this.serverData=serverData;
    }

    /**
     * 执行命令动作
     * @param clinetData
     */
    public void Do(ClinetData clinetData){
        System.out.println("服务器数据解析器：准备执行命令动作："+clinetData);
        if (serverData==null){
            System.out.println("服务器数据解析器：服务器数据为空！");
            return;
        }
        FileInfo fileInfo=serverData.getFileInfo();
        if (fileInfo.getDataType()== DataType.Folder){
            Show();
        } else if (fileInfo.getDataType()==DataType.File) {
            Download();
        }else {
            System.out.println("服务器数据解析器：服务器数据类型错误！fileinfo为："+fileInfo);
        }
    }

    /**
     * 执行方法：执行展示动作
     */
    public void Show(){
        System.out.println("服务器数据解析器：客户端准备执行展示动作！");
        FolderData folderData= (FolderData) serverData;
        List<FileInfo> fileDataList=folderData.getAllData();
        for (int i=0;i<fileDataList.size();i++){
            System.out.println("服务器数据解析器：文件夹数据："+ i +"："+fileDataList.get(i).getPath());
        }
    }

    /**
     * 获取展示的数据
     *
     * @return
     */
    @Override
    public List<FileInfo> getShowData() {
        System.out.println("服务器数据解析器：返回展示数据");
        FolderData folderData= (FolderData) serverData;
        List<FileInfo> fileDataList=folderData.getAllData();
        return fileDataList;
    }

    /**
     * 下载方法：执行下载动作
     */
    public void Download() {
        System.out.println("服务器数据解析器：客户端准备执行下载动作！");
        FileData fileData = (FileData) serverData;
        List<BlockData> blockDataList = fileData.getAllData();

        System.out.println("服务器数据解析器：文件数据：" + fileData.getPath());

        // 确保目标文件夹存在
        File targetFolder = new File("./testDownData");
        if (!targetFolder.exists()) {
            targetFolder.mkdirs();
        }
        // 获取文件名
        String fileName = Paths.get(fileData.getName()).getFileName().toString();
        // 创建目标文件
        File targetFile = new File(targetFolder, fileName);

        try (FileOutputStream fos = new FileOutputStream(targetFile)) {
            for (BlockData blockData : blockDataList) {
                fos.write(blockData.BlockData);
            }
            System.out.println("文件下载完成：" + targetFile.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件下载失败：" + e.getMessage());
        }
    }

    ///////////////////////////////////工具方法////////////////////////////////////////////////////

    /**
     * 将文件大小转化为MB展示
     * @param fileSize
     * @return
     */
    private String FileSizeToMB(String fileSize){
        long size = Long.parseLong(fileSize);
        return String.valueOf(size/1024/1024);
    }
    private String FileSizeToMB(float fileSize) {
        return String.format("%.2f", fileSize / 1024 / 1024);
    }
}
